package Principal;


import java.io.*;
import java.util.*;
import java.util.Calendar;
import javax.microedition.midlet.*;
import java.lang.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;

/**
 * Clase Gasto. Almacena para cada gasto, la fecha, la categoría, la cantidad y la moneda.
 * @author Noelia Alonso Garrido
 * @author Abel Torres Alonso
 * @author Diego Vallejo Alonso
 */
public class Gasto {

    public int dia;
    public int mes;
    public int anio;
    public String categoria;
    public float cantidad;
    private float cEquivalente; //La cantidad de este gasto expresada en la moneda de referencia
    private boolean actualizado;    //para llevar el control sobre c Equivalente y los cambios de la moneda de referencia
    private String codigoMoneda;

    public Gasto(){
        this.dia = 0;
        this.mes = 0;
        this.anio = 0;
        this.categoria = null;
        this.cantidad = 0;
        this.cEquivalente = 0;
        this.actualizado = false;
        this.codigoMoneda = null;
    }

    /**
     * Método de creación de la clase
     * @param f La fecha del gasto
     * @param c La categoría  del gasto.
     * @param can La cantidad del gasto.
     * @param m La moneda del gasto.
     */

    public Gasto(int d, int me, int a, String c, float can, String m) {
        this.dia = d;
        this.mes = me;
        this.anio = a;
        this.categoria = c;
        this.cantidad = can;
        this.cEquivalente = 0;
        this.actualizado = false;
        this.codigoMoneda = m;

        if (this.codigoMoneda.equals("EUR")){       //El euro es la moneda de referencia por defecto
            this.cEquivalente = this.cantidad;
        }

    }

    /**
     * Extrae de una cadena en formato dd-mm-aaaa el dia, el mes y el año de un gasto.
     * @param s Cadena con la fecha en formato dd-mm-aaaa.
     * @return c Instancia del calendario con la nueva fecha.
     */
     public Date getfecha (String s){

        Calendar c = Calendar.getInstance();
	c.set(Calendar.DAY_OF_MONTH, Integer.parseInt(s.substring(0, 2)));
	c.set(Calendar.MONTH, Integer.parseInt(s.substring(3, 5)) - 1);
	c.set(Calendar.YEAR, Integer.parseInt(s.substring(6, 10)));

	return c.getTime();
    }

     /**
      * Categoría del gasto.
      * @return La categoría del gasto.
      */
    public String getCategoria() {
        return (this.categoria);
    }

    /**
     * Devuelve el código de moneda de este gasto
     * @return el código de moneda de este gasto
     */

    public String getCodigo(){
        return this.codigoMoneda;
    }

    /**
     * Esta funcion nos transforma lo que introducimos en el textField de cantidad
     * a un float
     * @return cant: cantidad expresada en float
     */
    public float getCantidad() {
        return (this.cantidad);
    }

    /**
     * Pretty printer de la clase
     * @return Un String con todos los datos del gasto listos para mostrar por pantalla.
     */
    public String toString() {
        String m;
        String d;

        if (this.dia < 10){
            d = "0" + this.dia;
        } else {
            d = "" + this.dia;
        }

        if (this.mes < 10){
            m = "0" + this.mes;
        } else {
            m = "" + this.mes;
        }
        return (d + "/" + m + "/" + this.anio + " (" + this.categoria + "): " + this.cantidad + " " + this.codigoMoneda);
    }
    /**
    * Año del gasto.
    * @return Año del gasto
    */
    public int getAnio(){
        return this.anio;
    }

    /**
     * Mes del gasto.
     * @return Mes del gasto.
     */
    public int getMes(){
        return this.mes;
    }

    /**
     * Día del gasto.
     * @return Día del gasto.
     */
    public int getDia(){
        return this.dia;
    }

    /**
     * Informa de si el parámetro cEquivalente de este gasto se corresponde a su valor con la
     * moneda de referencia actual.
     * @return true si el valor cEquivalente expresa el gasto en la moneda de referencia actual, false en caso contrario.
     */
    public boolean estaActualizado(){
        return this.actualizado;
    }

    /**
     * Devuelve el importe del gasto expresado en la moneda de referencia
     * @return el importe del gasto expresado en la moneda de referencia
     */
    public float getCantidadEquivalente(){
        return this.cEquivalente;
    }

    /**
     * Establece que un gasto ha sido actualizado o no.
     * @param b Indica si el gasto fue actualizado.
     */
    public void setActualizado(boolean b){
        this.actualizado = b;
    }

    /**
     * Establece la cantidad equivalente de un gasto.
     * @param f La cantidad a almacenar.
     */
    public void setCantidadEquivalente(float f){
        this.cEquivalente = f;
    }

    /**
     * Convierte el objeto a un vector de bytes listo para ser almacenado en un Registro
     * @return el objeto al que se llama con este método serializado
     * @throws IOException
     */
    public byte[] aByteArray() throws IOException {

        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        DataOutputStream dout = new DataOutputStream(bout);

        dout.writeInt(this.dia);
        dout.writeInt(this.mes);
        dout.writeInt(this.anio);
        dout.writeUTF(this.categoria);
        dout.writeFloat(this.cantidad);
        dout.writeFloat(this.cEquivalente);
        dout.writeBoolean(this.actualizado);
        dout.writeUTF(this.codigoMoneda);
        dout.flush();
        return bout.toByteArray();

    }

    /**
     * Establece los valores del objeto a los obtenidos a partir de un array de bytes
     * extraído de un Registro.
     * @param data Array de Bytes con los datos de una moneda serializada.
     * @throws IOException
     */
    public void desdeByteArray(byte[] data) throws IOException {
        ByteArrayInputStream bin = new ByteArrayInputStream(data);
        DataInputStream din = new DataInputStream(bin);

        this.dia = din.readInt();
        this.mes = din.readInt();
        this.anio = din.readInt();
        this.categoria = din.readUTF();
        this.cantidad = din.readFloat();
        this.cEquivalente = din.readFloat();
        this.actualizado = din.readBoolean();
        this.codigoMoneda = din.readUTF();
    }
}
